package com.itheima.filter;

import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//@WebFilter("/*")
@Slf4j
public class LoginCheckFilter implements Filter {

  /*
  ServletRequest request, ServletResponse response,

  HttpServletRequest request, HttpServletResponse response
    实现的效果 保证用户登录后才能访问某些资源
   */
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//        chain.doFilter(request, response);放行语句什么时候执行？
        //放行逻辑了？ 什么时候需要放行？  login请求放行  有令牌 且 令牌有效放行
        // 请求响应进行向下转型--- 使用子类特有方法
        HttpServletRequest request=(HttpServletRequest)req;
        HttpServletResponse response =(HttpServletResponse)resp;

        //1:获取请求路径
        String url = request.getRequestURL().toString();

        //2:判断路径是否包含 login 包含 登录请求 放行
       if(url.contains("login")){
           log.info(url+":登录功能实现放行");
           chain.doFilter(request, response);
           return;//后面不用执行了
       }

        //3:获取请求头中  token 令牌
        String token = request.getHeader("token");
        //4: 如果令牌不存在 不放行 返回 NOT_LOGIN
       if(token==null||token.length()==0){//说明token没有
           log.info(url+":您没有带token来,说明是没有登录过....");
           //返回错误信息
           Result result = Result.error("NOT_LOGIN");
           // 把数据转换json  导入fastjson依赖
           String jsonString = JSON.toJSONString(result);
           //只能使用 Response响应
           response.setContentType("application/json;charset=utf-8");
           response.getWriter().write(jsonString);
           return;//后面不用执行了
       }
        //5: 令牌存在, 校验是否 有效
         // 有异常 说明 无效
        // 没有异常 说明有效
        try{
            Claims claims = JwtUtils.parseJWT(token);
            //claims 前后端交互的数据
            //有效

        }catch (Exception e){
            log.info(url+":您带token来,令牌失效...");
            //无效
            //返回错误信息
            Result result = Result.error("NOT_LOGIN");
            // 把数据转换json  导入fastjson依赖
            String jsonString = JSON.toJSONString(result);
            //只能使用 Response响应
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(jsonString);
            return;//后面不用执行了
        }

        //6: 有效就放行
//        chain.doFilter(request, response);//写这里可以
        log.info(url+"：令牌有效,可以访问");
        chain.doFilter(request, response);//写这里也可以
    }



    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }


}
